package edu.asselvi.seguros.dao;

import java.sql.Connection; 
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import edu.asselvi.seguros.db.ConnectionFactory;
import edu.asselvi.seguros.db.DbUtils;
import edu.asselvi.seguros.exception.ESegurosErros;
import edu.asselvi.seguros.exception.SegurosException;
import edu.asselvi.seguros.pojo.Cidade;


public class CidadeDao extends DbUtils {

	Connection conn = null;
	
	public CidadeDao(Connection conn) {
		this.conn = conn;
	}
	
	public CidadeDao() throws SegurosException {
		this.conn = new ConnectionFactory().getConnection();
	}
	
	
	public Cidade insert(Cidade cidade) throws SegurosException {

		String sql = "INSERT INTO cidades (ID_CIDADE, NOME, FK_ID_ESTADO) VALUES (?, ?, ?)";
		PreparedStatement p = null;
		
		try {
			p = conn.prepareStatement(sql);
			cidade.setId_cidade(getNextId("SEQ_CIDADES", conn));
			int cont = 1;
			p.setInt(cont++, cidade.getId_cidade());
			p.setString(cont++, cidade.getNome());
			p.setInt(cont++, cidade.getFk_id_estado());

			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_INSERCAO);
		} finally {
			close(p);
		}
		
		return cidade;
	}
	
	
	public List<Cidade> list() throws SQLException, SegurosException{

		String sql = "SELECT * FROM CIDADES";

		List<Cidade> lista = null;
		java.sql.ResultSet rs = null;
		PreparedStatement p = null;
		
		try {
			lista = new ArrayList<Cidade>();
			p = conn.prepareStatement(sql);
			rs = p.executeQuery();
			
			while (rs.next()) {
				Cidade cidade = new Cidade();
				cidade.setId_cidade(rs.getInt("ID_CIDADE"));
				cidade.setNome(rs.getString("NOME"));
				cidade.setFk_id_estado(rs.getInt("FK_ID_ESTADO"));

				lista.add(cidade);
			}
			
			if (lista.isEmpty()){
				throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
			} 
			
			
		} finally {
			close(p);
			close(rs);
		}

		return lista;
	}
	

	public List<Cidade> listByEstado(int codEstado) throws SQLException, SegurosException {
		
			String sql = "SELECT * FROM CIDADES WHERE FK_ID_ESTADO = ?";

			List<Cidade> lista = null;
			PreparedStatement p = null;
			java.sql.ResultSet rs = null;

			try {
				lista = new ArrayList<Cidade>();
				p = conn.prepareStatement(sql);
				p.setInt(1, codEstado);
				
				rs = p.executeQuery();

				while (rs.next()) {
					Cidade cidade = new Cidade();
					cidade.setId_cidade(rs.getInt("ID_CIDADE"));
					cidade.setNome(rs.getString("NOME"));
					cidade.setFk_id_estado(rs.getInt("FK_ID_ESTADO"));

					lista.add(cidade);
				}
				if (lista.isEmpty()){
					throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
				} 

			} finally {
				close(rs);
				close(p);
			}

			return lista;		
		}


	public Cidade getCidade(int id_cidade) throws SegurosException {
		
		String sql = "SELECT * FROM CIDADES WHERE ID_CIDADE = ?";
		Cidade cidade = new Cidade();
		PreparedStatement p = null;
		ResultSet rs = null;
		
		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_cidade);
			rs = p.executeQuery();

			while (rs.next()) {

				cidade.setId_cidade(rs.getInt("ID_CIDADE"));
				cidade.setNome(rs.getString("NOME"));
				cidade.setFk_id_estado(rs.getInt("FK_ID_ESTADO"));
				
			}
		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_RECUPERAR_DADOS);
			
		} finally {
			close(p);
			close(rs);
		}
		return cidade;
	}
	
	
	public void remove(int id_cidade) throws SegurosException {
		
		String sql = "DELETE FROM CIDADES WHERE ID_CIDADE = ?";

		PreparedStatement p = null;
		
		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_cidade);
			
			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_REMOVER_DADOS);
			
		} finally {
			close(p);
		}
		
	}
	
	public void update (Cidade cidade) throws SQLException {

		String sql = "UPDATE CIDADES SET NOME = ?, FK_ID_ESTADO = ? WHERE ID_CIDADE = ?";

		PreparedStatement p = null;
		
		try {
			p = conn.prepareStatement(sql);
			int cont = 1;
			p.setString(cont++, cidade.getNome());
			p.setInt(cont++, cidade.getFk_id_estado());
			p.setInt(cont++, cidade.getId_cidade());

			p.executeUpdate();
			p.close();
			conn.close();

		} finally {
			close(p);
		}
		
	}
	


	
}
